install.packages("nomPkg") : installe le package nomPkg localement sur votre machine.library(nomPkg) : charge le package nomPkg dans votre session R, dans votre environnement R ; cette commande doit être exécutée à chaque nouvelle session, sauf si vous avez sauvegardé votre session.# installation du package 'ggplot2' sur votre machine depuis le miroir de Lyon 1
install.packages("ggplot2", repos = "https://pbil.univ-lyon1.fr/CRAN/")
# chargement du package 'ggplot2' dans votre session R en cours
library(ggplot2)
Dans tous documents produits qui incluent du code R, le logiciel et les packages utilisés doivent être cités ; cette pratique est essentielle à l’exitence et au développement des logiciels libres.
citation() : retourne la manière de citer le logiciel R.citation("nomPkg") : retourne la manière de citer le package nomPkg.# référence bibliographique pour citer le logiciel R
citation()
##
## To cite R in publications use:
##
## R Core Team (2020). R: A language and environment for statistical
## computing. R Foundation for Statistical Computing, Vienna, Austria.
## URL https://www.R-project.org/.
##
## A BibTeX entry for LaTeX users is
##
## @Manual{,
## title = {R: A Language and Environment for Statistical Computing},
## author = {{R Core Team}},
## organization = {R Foundation for Statistical Computing},
## address = {Vienna, Austria},
## year = {2020},
## url = {https://www.R-project.org/},
## }
##
## We have invested a lot of time and effort in creating R, please cite it
## when using it for data analysis. See also 'citation("pkgname")' for
## citing R packages.
# référence bibliographique pour citer le package 'ggplot2'
citation("ggplot2")
##
## To cite ggplot2 in publications, please use:
##
## H. Wickham. ggplot2: Elegant Graphics for Data Analysis.
## Springer-Verlag New York, 2016.
##
## A BibTeX entry for LaTeX users is
##
## @Book{,
## author = {Hadley Wickham},
## title = {ggplot2: Elegant Graphics for Data Analysis},
## publisher = {Springer-Verlag New York},
## year = {2016},
## isbn = {978-3-319-24277-4},
## url = {https://ggplot2.tidyverse.org},
## }
getwd() : retourne le chemin du répertoire courant de travail.setwd() : définit le répertoire de travail..libPaths() : retourne le nom de tous les répertoires contenant les packages R installés sur la machine.sessionInfo() : retourne des informations sur la session R en cours.A VOUS ! (avec des commandes R)
La documentation officielle de R
Se documenter depuis votre session R
?nomFctn ou help("nomFctn") : retourne la fiche d’aide de la fonction nomFctn.example(nomFctn) : exécute l’exemple associé à la fonction nomFctn.vignette(package = "nomPkg") : charge la vignette du package nomPkg, un guide d’utilisation plus complet du package nomPkg.D’autres documentations utiles
N’hésitez pas à me communiquer vos ressources préférées pour que je puisse les partager avec vos collègues de promo !
# documentation sur le package 'ggplot2'
help("ggplot2-package")
# documentation sur la fonction 'geom_histogram' (package 'ggplot2')
?geom_histogram
help("geom_histogram")
help("geom_histogram", package = "ggplot2") # pour lever une éventuelle ambigüité, si un même nom de fonction a été utilisé dans plusieurs packages
# vignettes du package 'ggplot2'
vignette(package = "ggplot2")
vignette("ggplot2-specs", package = "ggplot2") # quand il y a plusieurs vignettes dans le package
#.; à la fin des lignes de commande (comme c’est le cas dans d’autres langages).<- permet d’affecter une valeur (élément de droite) à une variable (élément de gauche).Importer des données
read.table() : importe un fichier de données tabulées.scan(), readline() et readLines() : importent des données de manière plus flexible (format des données, options d’import, saisie interactive).data() et load() : importent des jeux de données (généralement au format .RData ou .rda).D’autres packages pour lire vos données :
readr (Wickham, Hester, and Francois 2018) pour accèder aux fichiers plats de manière performante.readxl (Wickham and Bryan 2019) et XLConnect (GmbH et al. 2018) pour traiter les fichiers Excel.foreign (R Core Team 2017) pour lire et écrire des données issues de logiciels tels que SPSS, SAS, Stata, …seqinR (Charif and Lobry 2007) et sa fonction read.fasta pour faciliter l’import de données génomiques.rjson (Couture-Beil 2018) pour traiter les fichiers JSON.XML (Lang and CRAN Team 2019) pour accèder à des données issues du web.bigmemory (Kane, Emerson, and Weston 2013) et ff (Adler et al. 2018) pour gérer efficacement les données volumineuses.Quand R charge un jeu de données, toutes les données sont importées dans l’environnement R et sont donc disponibles dans la mémoire :
# chargement du jeu de données 'doubs' du package 'ade4'
install.packages("ade4")
library(ade4)
data(doubs)
Exporter et sauver des données
Exporter des données a un intérêt (1) quand les données initialement importées ont été modifiées dans R, ou (2) quand les données ont été générées / simulées dans R.
save() : sauvegarde un ensemble d’objets R dans un fichier spécifique (généralement au format .RData ou .rda).write.table : enregistre des données tabulées dans un fichier.Ici, sont présentés les principaux types de données. Il existe d’autres types de données (dates, séries temporelles, données spatiales, …) et les possibilités de typage sont enrichies par les nombreux packages R existants.
Les données numériques
numeric, double, integeris.numeric(), is.double(), is.integer() : testent si un objet est numérique.as.numeric(), as.double(), as.integer() : convertissent un objet en numérique.Les facteurs
Un facteur est une variable catégorielle qui possède un attribut levels définissant l’ensemble des valeurs qu’il peut prendre.
factoris.factor() : teste si un objet est un facteur.as.factor() : convertit un objet en facteur.levels(), levels() <- : retourne et affecte les niveaux de valeur d’un facteur.Les caractères
characteris.character() : teste si un objet est un caratère.as.character() : convertit un objet en caractère.paste() : concatène deux chaînes de caractères.letters, LETTERS, month.abb, month.name : retournent des chaînes de caractères prédéfinies.Les valeurs booléennes
TRUE et FALSEis.logical() : teste si un objet est booléen.as.logical() : convertit un objet en booléen.isTRUE() : teste si une valeur est égale à TRUE.! (négation logique), & (‘et’ logique), | (‘ou’ logique)Les valeurs manquantes
NA (i.e. Not Available) est un indicateur de valeur manquante. is.na() teste si une valeur est manquante.NaN (i.e. Not a Number) matérialise une valeur numérique qui n’est pas réelle. is.nan() teste si un numérique n’est pas réel.NULL représente un objet vide. is.null() teste si une valeur est définie. NULL est différent de NA.Quelques commandes utiles
str() : retourne la structure d’un objet R.class() et typeof() : retournent la classe (au sens de la Programmation Orientée Objet) et le type d’un objet (au sens du typage dans R). La classe d’un objet peut être définie / modifiée par l’utilisateur.trice, pas son type. Les deux fonctions peuvent renvoyer le même résultat.names(), colnames() et rownames() : retournent les noms d’un objet, le nom de ses colonnes et le nom de ses lignes.length() et dim() : retournent la longueur et la dimension d’un objet.head() et tail() : extraient les premiers et les derniers éléments d’un objet.[, [[ et $ : extraient un ou plusieurs éléments d’un objet.L’indexation des objets commence à 1 (et non à 0, comme dans certains langages).
L’extraction d’un élément d’un objet peut se faire en spécifiant :
TRUELes vecteurs
vector() : crée un vecteur.is.vector() : teste si un objet est un vecteur.as.vector() : convertit un objet en vecteur.seq(), c(), rep(), : : générent quelques vecteurs utiles.Les matrices
matrix() : crée une matrice.is.matrix() : teste si un objet est une matrice.as.matrix() : convertit un objet en matrice.cbind() et rbind() : concatènent les colonnes et les lignes d’une matrice.nrow() et ncol() : retournent le nombre de lignes et de colonnes d’une matrice.Les data frames
data.frame est une structure spécifique à R.data.frame() : crée un data frame.is.data.frame() : teste si un objet est un data frame.as.data.frame() : convertit un objet en data framecolnames() et rownames() : retournent le nom des lignes et des colonnes d’un data frame.Les listes
list() : crée une liste.is.list() : teste si un objet est une liste.as.list() : convertit un objet en liste.unlist() : simplifie une liste en vecteur.# structure des données 'doubs'
str(doubs)
# 'doubs' est-il une liste ?
is.list(doubs)
# nom des objets contenus dans 'doubs'
names(doubs)
# dimension de l'objet 'fish' de 'doubs'
dim(doubs$fish)
# les 10 premières lignes de 'fish'
head(doubs$fish, 10)
doubs[["fish"]][1:10, ]
# création d'un objet 'dfish'
dfish <- doubs$fish
# nom des colonnes de 'dfish'
names(dfish)
colnames(dfish)
# dimension de 'dfish'
dim(dfish)
# l'objet 'dfish' est-il un data.frame ?
is.data.frame(dfish)
# classe de la colonne 'Cogo' de 'dfish'
class(dfish$Cogo)
# type de la colonne 'Satr' de 'dfish'
typeof(dfish$Satr)
# modification de la classe de la colonne 'Cogo' de 'dfish'
class(dfish$Cogo) <- "character"
# structure de 'dfish'
str(dfish)
# modification du type de la colonne 'Satr' de 'dfish'
# renvoie une erreur : impossible de modifier le 'type' d'une variable
# typeof(dfish$Satr) <- "character"
Quelques outils pour le ménage et le rangement
sort() , order() et rank() : trient et ordonnent un vecteur.sample() : échantillonne un nombre d’éléments, avec ou sans remise.table() : construit une table de contingence.which() : retourne les positions des éléments pour lesquels la condition est vraie.na.omit() : supprime les valeurs NA d’un objet.subset() : sélectionne un sous-ensemble de données.%in% et match() : retournent les positions des éléments d’un premier objet qui correspondent avec les éléments d’un deuxième objet.cut() : coupe un vecteur en plusieurs sections et le convertit en facteur.with() : évalue une expression dans un environnement de données.na.fail(), na.exclude(), na.pass() : traitent les NA.Des spécialistes de la grammaire des données
plyr(Wickham 2011) : arrange(), mutate(), summarise(), join(), …dplyr (Wickham et al. 2017) : filter(), arrange(), select(), rename(), mutate(), transmute(), summarise(), …stringr (Wickham 2018)tidyr (Wickham and Henry 2018)magrittr (Bache and Wickham 2014)stringi (Gagolewski 2017)AVANT DE COMMENCER : Prenez bien connaissance, en Annexe, de la documentation liée aux jeux de données que vous allez étudier sur les varis dans la suite de ce cours.
A VOUS ! (avec des commandes R)
dfvaris_litter.Rdata dans votre session R.sub_dfvaris_litter contenant 100 portées (prises au hasard) de chaque espèce.PAD (Parental Age Difference) dans dfvaris_litter, égale à l’âge du père moins l’âge de la mère.Les structures conditionnelles
if(test) expr.oui else expr.nonswitch(var, val1 = expr.val1, val2 = expr.val2, val3 = expr.val3, ...)Les structures itératives
for(var in seq) exprwhile(test) expr. L’expression continue à être exécutée tant que la condition est respectée.repeat exprbreak interrompt une boucle ; next passe à l’itération suivante.for incrémente elle-même l’itérateur.while et repeat, il est primordial d’incrémenter explicitement l’itérateur, sans quoi, le code pourrait boucler à l’infini et endommager un programme.Utiliser une fonction existante
install.packages(), library(), read.table(), data(), is.numeric(), as.numeric(), …).args(), formals() et formalArgs() retournent, sous différentes formes, les éléments qui définissent une fonction.ls() liste l’ensemble des objets existants dans un environnement R.ls()
args(ls)
args("plot")
args("plot.default")
str(plot.default)
Créer votre propre fonction
return() : matérialise les éléments renvoyés par la fonction créée.invisible() : retourne une copie (temporairement) invisible d’un objet.on.exit() : stocke des valeurs d’éléments qui seront restaurées à la fin / sortie de la fonction.stop(), stopifnot(), message() et error() : caractérisent les messages envoyés à l’utilisateur.trice au cours de l’exécution d’une fonction.A VOUS ! (avec des commandes R)
Supposez une fonction info_vect qui prend en entrée un vecteur et qui renvoie une liste contenant la classe de ce vecteur, sa longueur, le résultat de la fonction summary appliquée à ce vecteur et le nombre de valeurs manquantes contenues dans ce vecteur.
survlitter48h du jeu de données dfvaris_litter.dfvaris_litter.Pour aller plus loin :
lapply qui vous donnera le même résultat.Un graphique scientifique
Le choix du graphique
Annoter judicieusement votre graphique
expression().Travailler les couleurs
grDevices (R Core Team 2018a) : colors(), palette(), rainbow() et grey().RColorBrewer (Neuwirth 2014) : brewer.pal() et display.brewer.all().wesanderson (Ram and Wickham 2018), ggsci (Xiao 2018), ggthemes (Arnold 2019), colourpicker (Attali 2017), …A VOUS ! (avec des commandes R)
graphics, inspirez-vous de la Figure S1 (ci-dessous et en annexe de l’article de Tidière et al. (2018)) pour créer un graphique contenant :
Les graphiques font partie intégrante de l’analyse statistique des données.
Dans R, la visualisation graphique des données est géré historiquement par le package graphics (R Core Team 2018a) :
plot().boxplot(), hist(), image(), contour(), dotchart(), curve(), barplot(), stripchart(), pie(), stars(), matplot(), pairs(), mosaicplot(), smoothScatter(), …hist(), boxplot(), barplot().points(), lines(), segments(), text(), abline(), legend(), title(), mtext(), rect(), arrows(), polygon(), grid(), rug(), …qqnorm(), qqline(), qqplot()par().graphics.off(), pdf(), png() et dev.off().# Distribution de l'âge des mères
# Création de l'histogramme de l'âge des mères
h_agedam <- hist(dfvaris_litter$agedam, freq = FALSE,
main = "Distribution de l'âge des mères",
xlab = "Age de la mère en années", ylab = "Densité")
# Ajout d'une courbe de densité
dens_agedam <- density(dfvaris_litter$agedam)
lines(dens_agedam)
# Ajout d'une ligne verticale ayant pour abscisse l'âge moyen des mères
abline(v = mean(dfvaris_litter$agedam), col = "red")
# Coloration de l'aire sous la courbe de densité pour les valeurs inférieures au 1er quartile
qrtle1 <- summary(dfvaris_litter$agedam)["1st Qu."]
polygon(c(0, dens_agedam$x[dens_agedam$x <= qrtle1]),
c(dens_agedam$y[dens_agedam$x <= qrtle1], 0),
col = rgb(1, 0, 0, alpha = 0.3))
A VOUS ! (avec des commandes R)
# Distribution de l'âge des mères et des pères en fonction de l'espèce
# Préparation d'une zone graphique à deux lignes et deux colonnes
par(mfrow = c(2, 2))
# Création d'un vecteur contenant l'âge des mères de l'espèce V. Rubra
dfagedam_vr <- dfvaris_litter$agedam[dfvaris_litter$species == "Vrubra"]
# Création de l'histogramme de l'âge des mères de l'espèce V. Rubra
hist(dfagedam_vr, freq = FALSE, main = "Distribution de l'âge des mères\nde l'espèce V. Rubra",
xlab = "Age de la mère", ylab = "Densité", col = "#69b3a2")
# Ajout de la courbe de densité de l'âge des mères de l'espèce V. Rubra
lines(density(dfagedam_vr))
# Création d'un vecteur contenant l'âge des mères de l'espèce V. Variegata
dfagedam_vv <- dfvaris_litter$agedam[dfvaris_litter$species == "Vvariegata"]
# Création de l'histogramme de l'âge des mères de l'espèce V. Variegata
hist(dfagedam_vv, freq = FALSE, main = "Distribution de l'âge des mères\nde l'espèce V. Variegata",
xlab = "Age de la mère", ylab = "", col = "#404080")
# Ajout de la courbe de densité de l'âge des mères de l'espèce V. Variegata
lines(density(dfagedam_vv))
# Création d'un vecteur contenant l'âge des pères de l'espèce V. Rubra
dfagesire_vr <- dfvaris_litter$agesire[dfvaris_litter$species == "Vrubra"]
# Création de l'histogramme de l'âge des pères de l'espèce V. Rubra
hist(dfagesire_vr, freq = FALSE, main = "Distribution de l'âge des pères\nde l'espèce V. Rubra",
xlab = "Age du père", ylab = "Densité", col = "#69b3a2")
# Ajout de la courbe de densité de l'âge des pères de l'espèce V. Rubra
lines(density(dfagesire_vr))
A VOUS ! (avec des commandes R)
# Distribution de l'âge des mères en fonction de l'espèce
# Création du boxplot de l'âge des mères en fonction de l'espèce et affichage des statistiques de calcul
(bxpt_agedam <- boxplot(dfvaris_litter$agedam ~ dfvaris_litter$species,
xlab = "", ylab = "Age de la mère", col = c("#69b3a2", "#404080")))
## $stats
## [,1] [,2]
## [1,] 2 2
## [2,] 5 5
## [3,] 8 8
## [4,] 12 11
## [5,] 21 20
##
## $n
## [1] 378 962
##
## $conf
## [,1] [,2]
## [1,] 7.431135 7.694353
## [2,] 8.568865 8.305647
##
## $out
## [1] 23 30 22 22 22 23 23 21 21 21 23 22 21 23 24 26 21 23
##
## $group
## [1] 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
##
## $names
## [1] "Vrubra" "Vvariegata"
A VOUS ! (avec des commandes R)
# Distribution de la taille des portées en fonction de l'espèce
# Création du boxplot de la taille des portées en fonction de l'espèce et affichage des statistiques de calcul
(bxpt_LSbirth <- boxplot(dfvaris_litter$littersizebirth ~ dfvaris_litter$species,
xlab = "", ylab = "Taille de la portée", col = c("#69b3a2", "#404080")))
## $stats
## [,1] [,2]
## [1,] 1 1
## [2,] 1 1
## [3,] 2 2
## [4,] 3 2
## [5,] 5 3
##
## $n
## [1] 378 962
##
## $conf
## [,1] [,2]
## [1,] 1.837467 1.949059
## [2,] 2.162533 2.050941
##
## $out
## [1] 5 4 4 4 4 4 4 4 4 4 5 4 5 4 5 4 4 4 4 4 5 6 4 4 4 4 5 4 4 4 4 4 4 4 4 4 6 4
## [39] 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 4 4 4 4
##
## $group
## [1] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [39] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
##
## $names
## [1] "Vrubra" "Vvariegata"
Dans R, la visualisation graphique des données a été réinventé par des packages comme grid (Murrell 2011 ; R Core Team 2018a), lattice (Sarkar 2008), ggplot2 (Wickham 2016).
Dans ggplot2 :
# Distribution de l'âge des mères (voir onglet A du chapitre 3.2)
# Chargement de la librairie ggplot2
library(ggplot2)
# Création d'un data.frame contenant les coordonnées de la courbe de densité de l'âge des mères
df_dens_agedam <- as.data.frame(cbind(x = dens_agedam$x, y = dens_agedam$y))
# Création et affichage de l'histogramme de l'âge des mères
(gg_hist_agedam <- ggplot(data = dfvaris_litter, aes(x = agedam)) +
ggtitle("Distribution de l'âge des mères") +
xlab("Age de la mère en années") + ylab("Densité") +
geom_histogram(alpha = 0.4, breaks = h_agedam$breaks, aes(y = ..density..), colour = "black") +
geom_vline(xintercept = mean(dfvaris_litter$agedam), colour = "red") +
geom_density(alpha = 0.2) +
geom_ribbon(data = subset(df_dens_agedam, x <= qrtle1), aes(x = x, ymax = y), ymin = 0, fill = "red", alpha = 0.3) +
geom_ribbon(data = subset(df_dens_agedam, x >= qrtle3), aes(x = x, ymax = y), ymin = 0, fill = "red", alpha = 0.3)
)
# Distribution de l’âge des mères et des pères en fonction de l'espèce (voir onglet B du chapitre 3.2)
# Chargement des librairies ggplot2 et gridExtra
library(ggplot2)
library(gridExtra)
# Préparation d'une liste qui contiendra les graphiques à afficher
gg_hist_age_spe <- list()
# Création de l'histogramme de l'âge des mères pour les deux espèces
gg_hist_age_spe[[1]] <- ggplot(data = dfvaris_litter, aes(x = agedam)) +
ggtitle("") + xlab("Age de la mère en années") + ylab("Densité") +
geom_histogram(alpha = 0.4, aes(y = ..density.., fill = species), bins = 15, color = "grey30") +
geom_density(alpha = 0.2) +
scale_fill_manual(values = c("#69b3a2", "#404080")) +
facet_wrap(~ species) +
theme(legend.position = "none")
# Création de l'histogramme de l'âge des pères pour les deux espèces
gg_hist_age_spe[[2]] <- ggplot(data = dfvaris_litter, aes(x = agesire)) +
ggtitle("") + xlab("Age du père en années") + ylab("Densité") +
geom_histogram(alpha = 0.4, aes(y = ..density.., fill = species), bins = 10, color = "grey30") +
geom_density(alpha = 0.2) +
scale_fill_manual(values = c("#69b3a2", "#404080")) +
facet_wrap(~ species) +
theme(legend.position = "none")
# Organisation et affichage des quatre graphiques
do.call(grid.arrange, c(gg_hist_age_spe, nrow = 2))
# Distribution de l'âge des mères en fonction de l'espèce (voir onglet C du chapitre 3.2)
# Chargement des librairies ggplot2 et gridExtra
library(ggplot2)
library(gridExtra)
# Préparation d'une liste qui contiendra les graphiques à afficher
gg_bxplt_age_spe <- list()
# Création du boxplot de l'âge des mères en fonction de l'espèce
gg_bxplt_age_spe[[1]] <- ggplot(data = dfvaris_litter, aes(x = species, y = agedam)) +
geom_boxplot(aes(fill = factor(species)), fill = c("#69b3a2", "#404080")) + guides(fill=FALSE) +
xlab("") + ylab("Age de la mère")
# Création du boxplot de l'âge des pères en fonction de l'espèce
gg_bxplt_age_spe[[2]] <- ggplot(data=dfvaris_litter, aes(x = species, y = agesire)) +
geom_boxplot(aes(fill = factor(species)), fill = c("#69b3a2", "#404080")) + guides(fill=FALSE) +
xlab("") + ylab("Age du père")
# Organisation et affichage des quatre graphiques
do.call(grid.arrange, c(gg_bxplt_age_spe, ncol = 2))
# Distribution de la taille des portées en fonction de l'espèce (voir onglet D du chapitre 3.2)
# Chargement des librairies ggplot2 et gridExtra
library(ggplot2)
# Création du boxplot de la taille des portées en fonction de l'espèce
(gg_bxplt_ls_spe <- ggplot(dfvaris_litter, aes(x = species, y = littersizebirth)) +
xlab("") + ylab("Taille de la portée") +
geom_boxplot(fill = c("#69b3a2", "#404080")))
# Création du 'violin plot' de la taille des portées en fonction de l'espèce
(gg_violin_ls_spe <- ggplot(dfvaris_litter, aes(x = species, y = littersizebirth, fill = species)) +
xlab("") + ylab("Taille de la portée") +
geom_violin(alpha = 0.2) +
scale_fill_manual(values = c("#69b3a2", "#404080")))
# Création du boxplot (avec les points) de la taille des portées en fonction de l'espèce
(gg_jitter_ls_spe <- ggplot(dfvaris_litter, aes(x = species, y = littersizebirth)) +
xlab("") + ylab("Taille de la portée") +
geom_boxplot(fill = c("#69b3a2", "#404080"), alpha = 0.2) +
geom_jitter(color = "black", size = 0.4, alpha = 0.9))
A VOUS ! (avec des commandes R)
ggplot2, reproduisez la figure que vous avez construite à la question 3.1.A, inspirée de la Figure S1 en annexe de l’article de Tidière et al. (2018).D’autres packages graphiques à explorer
rgdal (R. Bivand, Keitt, and Rowlingson 2020), sp(Pebesma and Bivand 2005 ; Bivand, Pebesma, and Gomez-Rubio 2013), rgeos (R. Bivand and Rundel 2020), cartography (Giraud and Lambert 2016 , 2017)dygraphs (Vanderkam et al. (2018) ; basé sur la bibliothèque JavaScript dygraphs)ape (Paradis and Schliep 2019), ggtree (Yu 2020 ; Yu et al. 2018 , 2017), phylogram (Wilkinson and Davy 2018)igraph (Csardi and Nepusz 2006)htmlwidgets (Vaidyanathan et al. 2018), rAmCharts (Thieurmel et al. (2019) ; basé sur la bibliothèque JavaScript amcharts.js)Des packages dédiés
plotly (Sievert 2018)leaflet (Cheng, Karambelkar, and Xie 2018)networkD3 (Allaire et al. 2017), visNetwork (Almende B.V., Thieurmel, and Robert 2019)threejs (Lewis 2017), rgl (Adler, Murdoch, and others 2019)DT (Xie, Cheng, and Tan 2019)d3heatmap (Cheng and Galili 2018)Des fonctionnalités automatiquement gérées
# Relation entre l'âge du père et l'âge de la mère chez deux espèces de varis
# Attention : certains éléments graphiques du ggplot initial ne sont pas conservés par ggplotly (cf le sous-titre qui a disparu).
library(plotly)
##
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
##
## last_plot
## The following object is masked from 'package:stats':
##
## filter
## The following object is masked from 'package:graphics':
##
## layout
ggplotly(gg_agedamsire)
# Distribution de l'âge des mères (voir onglets A des chapitres 3.2 et 3.3)
library(plotly)
ggplotly(gg_hist_agedam)
# Distribution de la taille des portées en fonction de l'espèce (voir onglets D des chapitres 3.2 et 3.3)
library(plotly)
ggplotly(gg_bxplt_ls_spe)
shinyshiny ?shiny (Chang et al. 2017) est un package R.shiny peut être contenu dans un seul fichier appelé app.R ou dans deux fichiers distincts appelés ui.R et server.R. Cette dernière solution est à priviliégier pour plus de clarté dans le code.runApp() ou par le bouton ‘Run App’ de RStudio.shiny : shinydashboard (Chang and Borges Ribeiro 2018), shinyWidgets (Perrier, Meyer, and Granjon 2019), shinycssloaders (Sali 2017), shinythemes (Chang 2018), shinyBS (Bailey 2015), shinyjs (Attali 2018), …Pour qu’une application soit fonctionnelle, les fichiers et les dossiers doivent être organisés comme suit :
ui.R et server.R doivent être à la racine du répertoire de l’application.www peut être dédié à des éléments qui ne sont pas nécessaires aux calculs R (images, logos, feuilles de styles, …).global.R peut être ajouté à la racine : il sera exécuté au lancement de l’application, avant tout autre chose, et une seule fois par session.Dans l’interface, on distingue :
Les inputs sont gérés via ce que shiny nomme des widgets (window gadgets). Un widget est :
ui.R par une fonction prédéfinie.Ci-dessous, les visuels de quelques widgets dans l’interface d’une application shiny :
Ci-dessous, les fonctions qui créent les widgets précédents dans l’interface et qui devront être définies dans le fichier ui.R :
Les outputs positionnés dans l’interface sont, par définition, réatifs, c’est-à-dire que leur contenu est modifié en réaction à une modification de l’interface (action de la part de l’utilisateur.trice). Le comportement des outputs sera établi du côté serveur par des fonctions render* (voir chapitre suivant).
Ci-dessous, les fonctions qui créent des outputs dans l’interface et qui devront être définies dans le fichier ui.R :
Les panels
wellPanel(), sidebarPanel(), mainPanel(), conditionalPanel(), headerPanel(), fixedPanel(), tabPanel(), titlePanel(), …Personnalisation
Les balises HTML sont nombreuses et permettent de définir finement tous les aspects d’une mise en page. Grâce à shiny, la richesse du HTML est accessible dans R via :
hr(), br(), a(), p(), div(), …?shiny::tags et names(tags)).www.A chaque fonction *Output() définie côté interface (voir chapitre précédent) correspond une fonction render*() définie côté server. A noter : si vous vous trompez de fonction associée, cela ne génèrera pas forcément une erreur mais engendrera sûrement un affichage vide.
shiny propose plusieurs fonctions pour gérer les différentes formes de réactivité des outputs :
reactive() permet de moduler la réactivité des éléments ; elle est utile notament quand certains morceaux de code sont utilisés par plusieurs outputs.eventReactive(), observe() et observeEvent() permettent de déclencher ou retarder une réaction.isolate() bloque une réaction.# liste les exemples d'applis shiny disponibles dans le package 'shiny'
shiny::runExample()
## Valid examples are "01_hello", "02_text", "03_reactivity", "04_mpg", "05_sliders", "06_tabsets", "07_widgets", "08_html", "09_upload", "10_download", "11_timer"
# lancement de l'exemple 4
library(shiny)
shinyAppDir(
system.file("examples/04_mpg", package = "shiny"),
options = list(width = "100%", height = 700)
)
# lancement d'une application définie par une partie 'ui' et une partie 'serveur'
library(shiny)
shinyApp(
ui = fluidPage(
selectInput("region", "Region:",
choices = colnames(WorldPhones)),
plotOutput("phonePlot")
),
server = function(input, output) {
output$phonePlot = renderPlot({
barplot(WorldPhones[,input$region]*1000,
ylab = "Number of Telephones", xlab = "Year")
})
},
options = list(height = 500)
)
# lancement d'une application passée à la fonction 'runApp'
library(shiny)
app <- shinyApp(
ui = fluidPage(
numericInput("n", "n", 1),
plotOutput("plot")
),
server = function(input, output) {
output$plot <- renderPlot( plot(head(cars, input$n)) )
}
)
runApp(app)
A VOUS ! (avec des commandes R)
doubs d’ade4 vu dans la section 2.1. Elle permet de visualiser l’abondance des différentes espèces de poissons prélevés au niveau de 30 sites localisés le long de la rivière Doubs. Ici, vous pourrez fournir une ou plusieurs captures d’écran de votre application.# ui.R
shinyUI(fluidPage(
# Titre de l'application
titlePanel("Exploration du jeu de données doubs d'ade4"),
# Menu déroulant pour choisir une espèce
# La liste des espèces est définie par les colonnes de doubs$fish
selectInput("espece", "Sélectionnez une espèce:",
choices = colnames(doubs$fish)),
# Graphique représentant l'abondance de l'espèce sélectionné à chaque position géographique (doubs$xy)
plotOutput("abondancePlot")
))
# server.R
library(shiny)
library(ade4)
shinyServer(function(input, output) {
output$abondancePlot <- renderPlot({
data(doubs)
df_espece <- doubs$fish[[input$espece]]
plot(doubs$xy$x, doubs$xy$y,
cex = ifelse(df_espece == 0, 1, df_espece),
pch = ifelse(df_espece == 0, 4, 19))
})
})
A VOUS ! (avec des commandes R)
dfvaris_litter, créez une application qui permettra d’afficher la distribution (histogramme et courbe de densité) de l’âge des parents chez les varis (voir les graphiques dans les onglets B des sections 3.2 et 3.3). Cette application contiendra :
Ici, vous pourrez fournir le code R et une ou plusieurs captures d’écran de votre application.
A VOUS ! (avec des commandes R)
dfvaris_litter, créez une application qui affiche un même graphique sous 3 formes différentes :
graphics,ggplot2ggplot2 et plotly.Vous pouvez, par exemple, choisir le boxplot de l’onglet D des sections 3.2 et 3.3 (représentant la distribution de la taille des portées en fonction de l’espèce) comme objet d’étude.
Ici, vous pourrez fournir le code R et une ou plusieurs captures d’écran de votre application.
A VOUS ! (avec des commandes R)
dfvaris_litter, créez une application qui permet d’explorer la Figure S1 en annexe de l’article de Tidière et al. (2018). Vous pourrez choisir d’utiliser les fonctions du package graphics ou celles du package ggplot2. Vous pourrez, par exemple, proposer des objets réactifs pour :
Ici, vous pourrez fournir le code R et une ou plusieurs captures d’écran de votre application.
Visualisation
Graphiques R
ggplot2
shiny
Les données que nous allons utiliser dans ce cours sont issues du Studbook Internationnal des lémuriens (Whipple 2014 , 2016). Ce Studbook répertorie la majorité des lémuriens de deux espèces (Varecia rubra et Varecia variegata) vivant en captivité (322 zoos à travers le monde) entre 1959 et 2015. Les deux espèces de lémuriens suivies sont deux espèces très proches. On pourra noter que l’âge de sevrage des petits (weaning) est atteint 146 jours après leur naissance (0.4 an), que la maturité sexuelle des individus est atteinte à l’âge de 1.16 an et que 1 à 7 petits peuvent constituer une portée (litter). Le jeu de données complet du Studbook contient 1954 V. rubra et 4169 V. variegata. La qualité de ce jeu de données est attribuable à la rigueur des personnels des zoos, qui peuvent réaliser, grâce aux conditions de captivité, un suivi minutieux des populations.
A partir de ce jeu de données conséquent, Tidière et al. (2018) ont étudié l’effet de l’âge des parents et de leur différence d’âge sur (1) la taille des portées et (2) la survie des descendants. Cet article apporte de nouvelles connaissances sur ces deux espèces de lémuriens et donne donc des pistes pour améliorer leur conservation et la gestion de leur population.
Dans le cadre de ce cours, seule une partie des données de Tidière et al. (2018) va être traitée. Ce jeu de données se nomme dfvaris_litter et compte 1340 portées étudiées sur 13 variables :
species : l’espèce (V. rubra ou V. variegata)yearbirth : l’année de naissance de la portéelittersizebirth : la taille de la portéelittersizeweaning : le nombre d’individus de la portée qui ont atteint l’âge de sevragesexratiobirth : le sex-ratio de la portée à la naissancesexratioweaning : le sex-ratio de la portée à l’âge de sevragesurvlitter48h : le taux de survie de la portée 48 heures après sa naissancesurvlitterweaning : le taux de survie de la portée à l’âge du sevragesurvlittersexmat : le taux de survie de la portée à l’âge de la maturité sexuelleagedam : l’âge de la mère à la naissance de la portéeagemaxdam : l’âge maximal atteint par la mèreagesire : l’âge du père à la naissance de la portéeagemaxsire : l’âge maximal atteint par le pèreAdler, Daniel, Christian Gläser, Oleg Nenadic, Jens Oehlschlägel, and Walter Zucchini. 2018. Ff: Memory-Efficient Storage of Large Data on Disk and Fast Access Functions. https://CRAN.R-project.org/package=ff.
Adler, Daniel, Duncan Murdoch, and others. 2019. Rgl: 3D Visualization Using Opengl. https://CRAN.R-project.org/package=rgl.
Allaire, J. J., Christopher Gandrud, Kenton Russell, and CJ Yetman. 2017. NetworkD3: D3 Javascript Network Graphs from R. https://CRAN.R-project.org/package=networkD3.
Almende B.V., Benoit Thieurmel, and Titouan Robert. 2019. VisNetwork: Network Visualization Using ’Vis.js’ Library. https://CRAN.R-project.org/package=visNetwork.
Arnold, Jeffrey B. 2019. Ggthemes: Extra Themes, Scales and Geoms for ’Ggplot2’. https://CRAN.R-project.org/package=ggthemes.
Attali, Dean. 2017. Colourpicker: A Colour Picker Tool for Shiny and for Selecting Colours in Plots. https://CRAN.R-project.org/package=colourpicker.
———. 2018. Shinyjs: Easily Improve the User Experience of Your Shiny Apps in Seconds. https://CRAN.R-project.org/package=shinyjs.
Bache, Stefan Milton, and Hadley Wickham. 2014. magrittr: A Forward-Pipe Operator for R. https://CRAN.R-project.org/package=magrittr.
Bailey, Eric. 2015. ShinyBS: Twitter Bootstrap Components for Shiny. https://CRAN.R-project.org/package=shinyBS.
Bivand, Roger, Tim Keitt, and Barry Rowlingson. 2020. Rgdal: Bindings for the ’Geospatial’ Data Abstraction Library. https://CRAN.R-project.org/package=rgdal.
Bivand, Roger, and Colin Rundel. 2020. Rgeos: Interface to Geometry Engine - Open Source (’Geos’). https://CRAN.R-project.org/package=rgeos.
Bivand, Roger S., Edzer Pebesma, and Virgilio Gomez-Rubio. 2013. Applied Spatial Data Analysis with R, Second Edition. Springer, NY. https://asdar-book.org/.
Chambers, John M. 2008. Software for Data Analysis, Programming with R. Edited by Springer. https://doi.org/10.1007/978-0-387-75936-4.
Chang, Winston. 2018. Shinythemes: Themes for Shiny. https://CRAN.R-project.org/package=shinythemes.
Chang, Winston, and Barbara Borges Ribeiro. 2018. Shinydashboard: Create Dashboards with ’Shiny’. https://CRAN.R-project.org/package=shinydashboard.
Chang, Winston, Joe Cheng, JJ Allaire, Yihui Xie, and Jonathan McPherson. 2017. shiny: Web Application Framework for R. https://CRAN.R-project.org/package=shiny.
Charif, D., and J. R. Lobry. 2007. “SeqinR 1.0-2: A Contributed Package to the R Project for Statistical Computing Devoted to Biological Sequences Retrieval and Analysis.” In Structural Approaches to Sequence Evolution: Molecules, Networks, Populations, edited by U. Bastolla, M. Porto, H. E. Roman, and M. Vendruscolo, 207–32. Biological and Medical Physics, Biomedical Engineering. New York: Springer Verlag.
Cheng, Joe, and Tal Galili. 2018. D3heatmap: Interactive Heat Maps Using ’Htmlwidgets’ and ’D3.js’. https://CRAN.R-project.org/package=d3heatmap.
Cheng, Joe, Bhaskar Karambelkar, and Yihui Xie. 2018. Leaflet: Create Interactive Web Maps with the Javascript ’Leaflet’ Library. https://CRAN.R-project.org/package=leaflet.
Couture-Beil, Alex. 2018. Rjson: JSON for R. https://CRAN.R-project.org/package=rjson.
Crawley, Michael J. 2013. The R Book. Edited by Wiley. https://doi.org/10.1002/9781118448908.
Csardi, Gabor, and Tamas Nepusz. 2006. “The Igraph Software Package for Complex Network Research.” InterJournal Complex Systems: 1695. http://igraph.org.
Gagolewski, Marek. 2017. R package stringi: Character string processing facilities. http://www.gagolewski.com/software/stringi/.
Giraud, Timothée, and Nicolas Lambert. 2017. “Reproducible Cartography.” In Advances in Cartography and Giscience. ICACI 2017. Lecture Notes in Geoinformation and Cartography., edited by Michael Peterson, 173–83. Cham, Switzerland: Springer. https://doi.org/10.1007/978-3-319-57336-6_13.
———. 2016. “Cartography: Create and Integrate Maps in Your R Workflow.” JOSS 1 (4). https://doi.org/10.21105/joss.00054.
GmbH, Mirai Solutions, Martin Studer, The Apache Software Foundation, and Graph Builder. 2018. XLConnect: Excel Connector for R. https://CRAN.R-project.org/package=XLConnect.
Kane, Michael J., John Emerson, and Stephen Weston. 2013. “Scalable Strategies for Computing with Massive Data.” Journal of Statistical Software 55 (14): 1–19. http://www.jstatsoft.org/v55/i14/.
Lang, Duncan Temple, and the CRAN Team. 2019. XML: Tools for Parsing and Generating Xml Within R and S-Plus. https://CRAN.R-project.org/package=XML.
Lewis, B. W. 2017. Threejs: Interactive 3D Scatter Plots, Networks and Globes. https://CRAN.R-project.org/package=threejs.
Murrell, Paul. 2011. R Graphics. Edited by Chapman & Hall. https://www.stat.auckland.ac.nz/~paul/RG2e/.
Neuwirth, Erich. 2014. RColorBrewer: ColorBrewer Palettes. https://CRAN.R-project.org/package=RColorBrewer.
Paradis, E., and K. Schliep. 2019. “Ape 5.0: An Environment for Modern Phylogenetics and Evolutionary Analyses in R.” Bioinformatics 35: 526–28.
Pebesma, Edzer J., and Roger S. Bivand. 2005. “Classes and Methods for Spatial Data in R.” R News 5 (2): 9–13. https://CRAN.R-project.org/doc/Rnews/.
Perrier, Victor, Fanny Meyer, and David Granjon. 2019. ShinyWidgets: Custom Inputs Widgets for Shiny. https://CRAN.R-project.org/package=shinyWidgets.
Ram, Karthik, and Hadley Wickham. 2018. Wesanderson: A Wes Anderson Palette Generator. https://CRAN.R-project.org/package=wesanderson.
R Core Team. 2017. foreign: Read Data Stored by Minitab, S, SAS, SPSS, Stata, Systat, Weka, dBase, ... https://CRAN.R-project.org/package=foreign.
———. 2018a. R: A Language and Environment for Statistical Computing. Vienna, Austria: R Foundation for Statistical Computing. https://www.R-project.org/.
———. 2018b. Writing R Extensions. https://cran.r-project.org/doc/manuals/r-release/R-exts.html.
Sali, Andras. 2017. Shinycssloaders: Add Css Loading Animations to ’Shiny’ Outputs. https://CRAN.R-project.org/package=shinycssloaders.
Sarkar, Deepayan. 2008. Lattice, Multivariate Data Visualisation with R. Edited by Springer. https://doi.org/10.1007/978-0-387-75969-2.
Sievert, Carson. 2018. Plotly for R. https://plotly-r.com.
Thieurmel, Benoit, Antanas Marcelionis, Jeffery Petit, Elena Salette, and Titouan Robert. 2019. RAmCharts: JavaScript Charts Tool. https://CRAN.R-project.org/package=rAmCharts.
Tidière, Morgane, Xavier Thevenot, Adamantia Deligiannopoulou, Guillaume Douay, Mylisa Whipple, Aurélie Siberchicot, Jean-Michel Gaillard, and Jean-François Lemaître. 2018. “Maternal Reproductive Senescence Shapes the Fitness Consequences of the Parental Age Difference in Ruffed Lemurs.” Proceedings of the Royal Society B: Biological Sciences 285 (1886). https://doi.org/10.1098/rspb.2018.1479.
Vaidyanathan, Ramnath, Yihui Xie, JJ Allaire, Joe Cheng, and Kenton Russell. 2018. htmlwidgets: HTML Widgets for R. https://CRAN.R-project.org/package=htmlwidgets.
Vanderkam, Dan, JJ Allaire, Jonathan Owen, Daniel Gromer, and Benoit Thieurmel. 2018. Dygraphs: Interface to ’Dygraphs’ Interactive Time Series Charting Library. https://CRAN.R-project.org/package=dygraphs.
Whipple, M. 2014. “International Studbook for Ruffed Lemurs.”
———. 2016. “International and North American Regional Studbooks for Ruffed Lemurs.”
Wickham, Hadley. 2011. “The Split-Apply-Combine Strategy for Data Analysis.” Journal of Statistical Software 40 (1): 1–29. http://www.jstatsoft.org/v40/i01/.
———. 2015a. Advanced R. Edited by Chapman & Hall. http://adv-r.had.co.nz/.
———. 2015b. R Packages. Edited by O’Reilly. http://r-pkgs.had.co.nz/.
———. 2016. ggplot2, Elegant Graphics for Data Analysis. Edited by Springer. http://ggplot2.org/.
———. 2018. stringr: Simple, Consistent Wrappers for Common String Operations. https://CRAN.R-project.org/package=stringr.
Wickham, Hadley, and Jennifer Bryan. 2019. Readxl: Read Excel Files. https://CRAN.R-project.org/package=readxl.
Wickham, Hadley, Romain Francois, Lionel Henry, and Kirill Müller. 2017. Dplyr: A Grammar of Data Manipulation. https://CRAN.R-project.org/package=dplyr.
Wickham, Hadley, and Lionel Henry. 2018. tidyr: Easily Tidy Data with ’spread()’ and ’gather()’ Functions. https://CRAN.R-project.org/package=tidyr.
Wickham, Hadley, Jim Hester, and Romain Francois. 2018. Readr: Read Rectangular Text Data. https://CRAN.R-project.org/package=readr.
Wilkinson, Shaun P., and Simon K. Davy. 2018. phylogram: An R Package for Phylogenetic Analysis with Nested Lists. Journal of Open Source Software. Vol. 3. https://doi.org/10.21105/joss.00790.
Xiao, Nan. 2018. Ggsci: Scientific Journal and Sci-Fi Themed Color Palettes for ’Ggplot2’. https://CRAN.R-project.org/package=ggsci.
Xie, Yihui, Joe Cheng, and Xianying Tan. 2019. DT: A Wrapper of the Javascript Library ’Datatables’. https://CRAN.R-project.org/package=DT.
Yu, Guangchuang. 2020. “Using Ggtree to Visualize Data on Tree-Like Structures.” Current Protocols in Bioinformatics 69 (1): e96. https://doi.org/10.1002/cpbi.96.
Yu, Guangchuang, Tommy Tsan-Yuk Lam, Huachen Zhu, and Yi Guan. 2018. “Two Methods for Mapping and Visualizing Associated Data on Phylogeny Using Ggtree.” Molecular Biology and Evolution 35 (2): 3041–3. https://doi.org/10.1093/molbev/msy194.
Yu, Guangchuang, David Smith, Huachen Zhu, Yi Guan, and Tommy Tsan-Yuk Lam. 2017. “Ggtree: An R Package for Visualization and Annotation of Phylogenetic Trees with Their Covariates and Other Associated Data.” Methods in Ecology and Evolution 8 (1): 28–36. https://doi.org/10.1111/2041-210X.12628.